26. Pliki Cookie


    Pliki Cookie, nazywane popularnie ciasteczkami, s▒ to dane zapisywane w pliku tekstowym u internauty odwiedzaj▒cego stronΩ. Mo┐na w nich zapamiΩtywaµ przydatne informacje, takie jak data ostatnich odwiedzin strony, imiΩ internauty, aby potem wykorzystaµ je na stronie powitalnej.

Ka┐de ciasteczko mo┐e zawieraµ wiΩcej ni┐ jedn▒ informacjΩ. Rozdzielane one s▒ przecinkami. S▒ one pouk│adane w nastΩpuj▒cy spos≤b:

Cookie: nazwa1:warto╢µ1; nazwa2=warto╢µ2; ...

Do ciasteczek mo┐emy dotrzeµ za pomoc▒ document.cookie. Zobaczmy przyk│ad funkcji, kt≤ra zapisuje do ciasteczka imiΩ internauty, poproszonego o jego podanie.

<SCRIPT LANGUAGE="JavaScript">
<!--

function ZapiszCiacho()
 {
  imie = window.prompt("Jak masz na imiΩ?");
  if (imie != null)
   {
    dzis = new Date();
    dzis.setTime(dzis.getTime() + 20*24*60*60*1000);
    s = dzis.toGMTString();
    document.cookie = "user_ID=" + escape(imie) + "; expires=" + s;
   }
 }

ZapiszCiacho();

//-->
</SCRIPT>

Zaraz po pobraniu od u┐ytkownika potrzebnych danych, sprawdzane jest, czy zosta│y one w og≤le wpisane. NastΩpnie pobierany jest bie┐▒cy czas przy u┐yciu obiektu Date. Zmienna dzis zawiera od tej pory ilo╢µ milisekund jaka up│ynΩ│a od p≤│nocy pierwszego stycznia 1970 roku do teraz. Wykorzystamy to, aby wyznaczyµ czas, po up│ywie kt≤rego ciasteczko wyga╢nie (parametr expires). Zawiera on r≤wnie┐ czas w milisekundach, wiΩc do bie┐▒cego czasu nale┐y dodaµ ilo╢µ milisekund, przez kt≤re ciasteczko bΩdzie u┐yteczne. Je┐eli chcemy, aby to by│o 20 dni to musimy pomno┐yµ je przez ilo╢µ milisekund w sekundzie (1000), nastΩpnie przez ilo╢µ sekund w minucie (60), potem przez ilo╢µ minut w godzinie (60) i dalej przez ilo╢µ godzin w dobie (24) - czyli 20*24*60*60*1000. Po up│ywie tego czasu skrypt zachowa siΩ jakby wcze╢niej nie zapisywano naszego ciasteczka.

Przy ka┐dorazowym wchodzeniu na stronΩ aplet pyta siΩ nas o imiΩ. Jedank nie o to nam chodzi│o. Trzeba zatem napisaµ jeszcze funkcjΩ, kt≤ra odczytywa│aby nasz Cookie. W tym celu bΩdziemy musieli r≤wnie┐ zmodyfikowaµ funkcjΩ zapisuj▒c▒:

<SCRIPT LANGUAGE="JavaScript">
<!--

function ZapiszCiacho(u_imie)
 {
  if (u_imie == null)
   {
    imie = window.prompt("Jak masz na imiΩ?");
   }
  else
   {
    imie = u_imie;
   }
  if (imie != null)
   {
    dzis = new Date();
    dzis.setTime(dzis.getTime() + 20*24*60*60*1000);
    s = dzis.toGMTString();
    document.cookie = "user_ID=" + escape(imie) + "; expires=" + s;
   }
 }

function OdczytajCiacho(nazwa)
 {
  var start = document.cookie.indexOf(nazwa + "=");
  var len = start + nazwa.length + 1;
  if ((!start) && (document.cookie.substring(0, nazwa.length) != nazwa))
   {
    return null;
   }
  if (start == -1)
   {
    return null;
   }
  var end = document.cookie.indexOf(";", len);
  if (end == -1) end = document.cookie.length;
  return unescape(document.cookie.substring(len, end));
 }

var ciacho = OdczytajCiacho("user_ID");
if (ciacho == null)
 {
  ZapiszCiacho()
 }
else
 {
  window.alert("Witam CiΩ ponownie " + ciacho);
  ZapiszCiacho(ciacho);
 }

//-->
</SCRIPT>

Rzuµmy okiem najpierw do tej czΩ╢ci kodu, w kt≤rej wywo│ywane s▒ funkcje. Zadeklarowana i zainicjowana jest tam zmienna ciacho. Przypisany jest jej wynik dzia│ania funkcji OdczytajCiacho(), kt≤ra jako parametr pobiera nazwΩ ciasteczka. Cookie jest przetrzymywane jako │a±cuch znakowy, tote┐ instrukcje w funkcji odczytuj▒cej g│≤wnie pr≤buj▒ odnale╝µ zadan▒ warto╢µ w stringu. Je┐eli nie znajd▒ - funkcja zwraca null, co oznacza, ┐e Cookie nie by│o nigdy zapisywane lub ju┐ wygas│o. W przeciwnym wypadku zwracana jest nasza warto╢µ. Warunek ten jest sprawdzany zaraz po deklaracji ciacho. Funkcja ZapiszCiacho() posiada teraz parametr. Mo┐e on zostaµ pominiΩty, co ma miejsce, gdy funkcja odczytuj▒ca nie zwr≤ci ┐▒danej, i wtedy u┐ytkownik pytany jest o imiΩ. Je┐eli parametr nie jest pominiΩty, oznacza to, ┐e uaktualniamy ciasteczko, aby nie wygas│o, mimo wizyty na stronie.

Mo┐na r≤wnie┐ wywo│aµ odczyt ciasteczka ju┐ po za│adowaniu strony. Nale┐y wtedy umie╢ciµ polecenia miΩdzy znacznikami <SCRIPT></SCRIPT> i przy ko±cu sekcji cia│a (zaraz przed zako±czeniem taga <BODY>).

Musimy pamiΩtaµ o tym, aby zapisywaµ datΩ w expires, poniewa┐ ciasteczko przesta│oby istnieµ, kiedy u┐ytkownik zako±czy swoj▒ sesjΩ.

Jednak przy tworzeniu Cookie na naszych stronach nie mo┐emy za mocno poszaleµ, poniewa┐ obowi▒zuj▒ nas pewne ograniczenia. U┐ytkownik nie mo┐e mieµ wiΩcej ni┐ 300 plik≤w Cookie, w tym co najwy┐ej 20 z jedego serwera lub domeny. Co wiΩcej plik ciasteczka nie mo┐e przekraczaµ 4 KB.

Bardzo du┐▒ zalet▒ plik≤w Cookie jest to, ┐e zapisane przez dan▒ stronΩ, mog▒ byµ odczytywane przez ni▒ i tylko przez ni▒.

Na koniec tej lekcji chcia│bym wspomnieµ jeszcze o zastosowaniach Cookie. DziΩki nim mo┐emy zapamiΩtywaµ preferencje u┐ytkownik≤w. Powiedzmy, ┐e internauta przesiaduje g│≤wnie w dziale po╢wiΩconemu algorytmom. Dlaczeg≤┐by nie u│atwiµ mu ┐ycia i od razu po jego wej╢ciu nie przekierowaµ go na stronΩ z algorytmami. Wspomnia│em ju┐ o obliczaniu odstΩpu czasu, kiedy u┐ytkownik ostatnio by│ na stronie. Posiadaj▒c takie informacje, mo┐na wy╢wietliµ odpowidnie newsy. Jak widaµ nie trzeba od razu siΩgaµ PHP, aby uzyskaµ takie efekty.